import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";

import js from "@eslint/js"; // ESLint 核心规则
import vue from "eslint-plugin-vue";
import typescriptEslint from "@typescript-eslint/eslint-plugin";
import vueParser from "vue-eslint-parser";
import globals from "globals"; // 全局变量库

// --- 动态加载所有子项目的 auto-import globals ---
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const appsDir = path.resolve(__dirname, "apps");

// --- 动态加载 ---
const allAutoImportGlobals = fs.readdirSync(appsDir).reduce((acc, appName) => {
  const appPath = path.join(appsDir, appName);
  const configFile = path.join(appPath, ".eslint-auto-import.json");

  if (fs.statSync(appPath).isDirectory() && fs.existsSync(configFile)) {
    try {
      const content = fs.readFileSync(configFile, "utf-8");
      const configJson = JSON.parse(content);
      if (configJson.globals) {
        Object.assign(acc, configJson.globals);
      }
    } catch (error) {
      console.error(`Error reading or parsing ${configFile}:`, error);
    }
  }
  return acc;
}, {});

// 1. 导入推荐配置
import vue3Flat from "eslint-plugin-vue/lib/configs/flat/vue3-recommended.js";
import prettierFlat from "eslint-config-prettier";

export default [
  {
    ignores: [
      // 忽略所有 node_modules 目录。虽然 ESLint 9+ 默认忽略，但显式声明更清晰。
      "**/node_modules/",

      // 忽略所有构建输出目录
      "**/dist/",

      // 忽略 Turborepo 的缓存目录
      ".turbo/",

      // 忽略测试覆盖率报告目录
      "**/coverage/",

      // 忽略 IDE 和编辑器相关的配置目录
      "**/.vscode/",
      "**/.idea/",

      // 忽略 pnpm 锁文件
      "pnpm-lock.yaml",

      // 忽略 public 目录下的所有文件，这些通常是静态资源
      "**/public/",

      // 忽略 husky 的配置目录
      ".husky/",
    ],
  },
  ...vue3Flat, //  使用 vue3-recommended 推荐规则
  prettierFlat, // 关闭所有与 Prettier 冲突的 ESLint 规则
  js.configs.recommended, // 使用 ESLint 推荐的核心规则
  {
    files: ["**/*.{js,ts,vue}"], // 适用于所有 JavaScript、TypeScript 和 Vue 文件
    languageOptions: {
      ecmaVersion: 2022, // 支持 ECMAScript 2022 语法
      sourceType: "module", // 代码以 ES 模块方式解析，支持 import/export
      parser: vueParser, // 使用 Vue 专用的解析器，支持 .vue 文件
      parserOptions: {
        parser: "@typescript-eslint/parser", // 去除 json Parsing error: Unexpected token : 报错
      },
      globals: {
        ...allAutoImportGlobals, // 引入自动导入的全局变量
        __PROJECT_NAME__: "readonly", // 定义全局变量 __PROJECT_NAME__，只读
        __PROJECT_VERSION__: "readonly", // 定义全局变量 __PROJECT_VERSION__，只读
        ...globals.browser, // 浏览器环境的全局变量
        ...globals.node, // Node.js 环境的全局变量
        $msg: "readonly",
        $loading: "readonly",
      },
    },
    plugins: {
      vue,
      "@typescript-eslint": typescriptEslint,
    },
    rules: {
      "no-console": "off", // 禁止使用 console，出现则报错
      "no-debugger": "warn", // 使用 debugger 时警告
      "no-unreachable": "off", // 关闭不可达代码检测
      "no-unused-vars": "warn", // 未使用变量时警告
      quotes: ["error", "double"], // 强制使用双引号
      "vue/attributes-order": "off", // 关闭 Vue 属性顺序检查
      "vue/multi-word-component-names": "off", // 关闭多单词组件名检查
      "vue/max-attributes-per-line": "off", // 强制每行最大属性数
      "vue/singleline-html-element-content-newline": "off", // 关闭单行 HTML 元素内容换行检查
      "vue/html-self-closing": "off", // 关闭 HTML 自闭合标签检查
      "no-constant-binary-expression": "off", // 关闭常量二进制表达式检查
    },
  },
];
